#include "BlockQueue.hpp"
#include "Task.hpp"
#include <pthread.h>
#include <unistd.h>
#include <ctime>
/* 单线程版：生产者消费者模型 */
using namespace std;
// 方法表中的一个功能函数
int myAdd(int x, int y){
    return x + y;
}

void* consumer(void* args){
    BlockQueue<Task> *bq = (BlockQueue<Task>*)args;
    // BlockQueue<int> *bq = (BlockQueue<int>*)args;

    while(true){
        // int a;
        // bq->pop(&a);
        // std::cout << "消费一个数据：" << a << std::endl;   

        // 获取任务
        Task t;
        bq->pop(&t);                                        /* 购物：取出物品 */
        // 完成任务
        cout << "Consumer : " << t._x << " + " << t._y << " = " << t.getRet() << endl;
        sleep(1);
    }
    return nullptr;
}

void* producer(void* args){
    BlockQueue<Task> *bq = (BlockQueue<Task>*)args;
    // BlockQueue<int> *bq = (BlockQueue<int>*)args;

    // int a = 1;
    while(true){
        // 随机任务派发
        int x = rand()%10 + 1;
        usleep(rand()%1000);
        int y = rand()%5 + 1;
        // cout << x << " + " << y << " = " << endl;
        // bq->push(a);

        Task t(x, y, myAdd);
        bq->push(t);                                        /* 上货 */
        cout << "Producer : " << t._x << " + " << t._y << " = ?" << endl;

        //std::cout << "生产一个数据：" << a << std::endl;   
        // a++;
        sleep(1);
    }

    return nullptr;
}

int main(){

    srand((uint64_t)time(nullptr)^getpid()^0x123);

    BlockQueue<int> *bq = new BlockQueue<int>();

    pthread_t t1,t2;
    // 基础框架部分：创建线程
    pthread_create( &t1, nullptr, consumer, bq);
    pthread_create( &t2, nullptr, producer, bq);


    // 基础框架部分：线程等待
    pthread_join( t1, nullptr);
    pthread_join( t2, nullptr);

    delete bq;

    return 0;
}